home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / cross / GBDK-2.0.lha / GBDK / examples / rpn.c < prev    next >
C/C++ Source or Header  |  1998-10-01  |  1KB  |  101 lines

  1. #include <stdio.h>
  2.  
  3. #define MAXOP     40
  4. #define NUMBER    '0'
  5. #define STACKSIZE 40
  6.  
  7. UBYTE sp;
  8. WORD stack[STACKSIZE];
  9.  
  10. char s[MAXOP];
  11. UBYTE pos;
  12. WORD n;
  13.  
  14. void push(WORD l)
  15. {
  16.   if(sp < STACKSIZE)
  17.     stack[sp++] = l;
  18.   else
  19.     puts("Stack full");
  20. }
  21.  
  22. WORD pop()
  23. {
  24.   if(sp > 0)
  25.     return stack[--sp];
  26.   else
  27.     puts("Stack empty");
  28.   return 0;
  29. }
  30.  
  31. WORD top()
  32. {
  33.   if(sp > 0)
  34.     return stack[sp-1];
  35.   else
  36.     puts("Stack empty");
  37.   return 0;
  38. }
  39.  
  40. BYTE read_op()
  41. {
  42.   if(pos == 0) {
  43.     gets(s);
  44.   }
  45.  
  46.   while(s[pos] == ' ' || s[pos] == '\t')
  47.     pos++;
  48.  
  49.   if(s[pos] == '\0') {
  50.     pos = 0;
  51.     return('\n');
  52.   }
  53.  
  54.   if(!isdigit(s[pos]))
  55.     return(s[pos++]);
  56.  
  57.   n = s[pos] - '0';
  58.   while(isdigit(s[++pos]))
  59.     n = 10 * n + s[pos] - '0';
  60.  
  61.   return NUMBER;
  62. }
  63.  
  64. void main()
  65. {
  66.   BYTE type;
  67.   WORD op2;
  68.  
  69.   puts("RPN Calculator");
  70.   sp = 0;
  71.   pos = 0;
  72.  
  73.   while((type = read_op(s)) != 0) {
  74.     switch(type) {
  75.     case NUMBER:
  76.       push(n);
  77.       break;
  78.     case '+':
  79.       push(pop() + pop());
  80.       break;
  81.     case '*':
  82.       push(pop() * pop());
  83.       break;
  84.     case '-':
  85.       op2 = pop();
  86.       push(pop() - op2);
  87.       break;
  88.     case '/':
  89.       op2 = pop();
  90.       if(op2 != 0)
  91.     push(pop() / op2);
  92.       else
  93.     puts("Divide by 0");
  94.       break;
  95.     case '\n':
  96.       printf("==> %ld\n", top());
  97.       break;
  98.     }
  99.   }
  100. }
  101.